package dian.qing.li.demo.security.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import dian.qing.li.demo.security.bean.UserParam;
import dian.qing.li.demo.security.config.security.LoginUser;
import dian.qing.li.demo.security.dto.UserDto;

import java.util.List;

/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author admin
 * @since 2020-07-01
 */
public interface UserService extends IService<UserDto> {

    /**
     * 用户登陆
     *
     * @param userCode 账号
     * @author: liqingdian
     */
    LoginUser login(String userCode);

    /**
     * 刷新缓存
     *
     * @param userCode
     * @author: liqingdian
     */
    void refreshRedis(String userCode, boolean deleted);

    /**
     * 分页查询
     *
     * @param tags  用户标签
     * @param param 查询条件
     * @param page  分页参数
     * @author: liqingdian
     */
    Page<UserDto> pages(List<String> tags, UserParam param, Page page);

    /**
     * 根据标签查询用户列表
     *
     * @param tags 用户标签
     * @author: liqingdian
     */
    List<UserDto> listByTags(List<String> tags);

    /**
     * 角色用户列表
     *
     * @param roleCode 角色编码
     * @author: liqingdian
     */
    List<UserDto> listByRole(String roleCode);

    /**
     * 获取用户详情
     *
     * @param id 主键
     * @author: liqingdian
     */
    UserDto find(Integer id);

    /**
     * 获取用户详情
     *
     * @param userCode 用户编码
     * @author: liqingdian
     */
    UserDto find(String userCode);

    /**
     * 新建用户
     *
     * @param inserted 新建
     * @author: liqingdian
     */
    boolean inserted(UserDto inserted);

    /**
     * 根据姓名生成账号
     *
     * @param userName 姓名
     * @author: liqingdian
     */
    String createUserCode(String userName);

    /**
     * 更新用户
     *
     * @param updated 更新
     * @author: liqingdian
     */
    boolean updated(UserDto updated);

    /**
     * 重置密码
     *
     * @param id 主键
     * @author: liqingdian
     */
    boolean resetPassword(Integer id);

    /**
     * 修改密码
     *
     * @param userCode    用户账号
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @author: liqingdian
     */
    boolean changePassword(String userCode, String oldPassword, String newPassword);

    /**
     * 是否禁用用户
     *
     * @param id       主键id
     * @param disabled true:禁用，false:启用
     * @author: liqingdian
     */
    boolean disabled(Integer id, boolean disabled);

    /**
     * 删除用户
     *
     * @param id 主键id
     * @author: liqingdian
     */
    boolean deleted(Integer id);

    /**
     * 授予角色
     *
     * @param userCode  用户账号
     * @param roleCodes 角色列表
     * @author: liqingdian
     */
    boolean grantRoles(String userCode, List<String> roleCodes);

    /**
     * 取消角色
     *
     * @param userCode  用户账号
     * @param roleCodes 角色列表
     * @author: liqingdian
     */
    boolean cancelRoles(String userCode, List<String> roleCodes);

    /**
     * 打标签
     *
     * @param userCode 用户账号
     * @param tags     标签编码列表
     * @author: liqingdian
     */
    boolean makeTags(String userCode, List<String> tags);
}
